package com.xuyuan.arithmetic.bit;

public class BasicKnowledge {
    // 在进行位运算时，注意添加小括号

    // 1.基础位运算
    /**
     * >>
     * <<
     * ~ 取反
     * & 有0为0
     * | 有1为1
     * ^ 相同为0，不同为1/无进位相加
     */

    // 2.给定一个数n，确定它的二进制表示中第x位是0还是1
    /**
     * (n>>x) & 1
     * 0->0
     * 1->1
     */

    // 3.将一个数n的二进制表示的第x位修改成1
    /**
     * n |=(1<<x)
     */

    // 4.将一个数n的二进制表示的第x位修改成0
    /**
     * n &= (~(1<<x))
     */

    // 5.提取一个数n二进制中最右端的1 (low bit)
    /**
     * n & -n
     * -n 本质是将最右侧的1的左边区域全部变为相反
     */

    // 6.干掉一个数n二进制表示最右侧的1
    /**
     * n & (n-1)
     *  n-1的本质是将最右侧的1的右边区域(包含这个1）,全部变成相反
     */

    // 异或运算的运算律
    /**
     * 1.a^0=a
     * 2.a^a=0
     * 3.a^b^c=a^(b^c)
     */
}